import pagesJson from '@/pages.json'

// 添加返回API的拦截器
uni.addInterceptor('navigateBack', {
  invoke() {
    const currentPages = getCurrentPages()
    if (currentPages.length <= 1) {
      uni.reLaunch({
        url: '/' + pagesJson.pages[0].path,
      })
      return false
    }
  },
})

// 添加蓝牙写入API的拦截器
uni.addInterceptor('writeBLECharacteristicValue', {
  invoke: (params) => {
    // console.log('params', params)
    // 若不是数组或者长度小于3则返回false 不发送
    if (!Array.isArray(params.value) || params.value.length < 3) {
      params.resolve && params.resolve()
      return false
    }
    // CRC-16/MODBUS 校验
    function crc16modbus(data) {
      const dataBytes = data.map((v) => parseInt(v, 16))
      let crc = 0xffff
      const polynomial = 0xa001 // This is the polynomial x^16 + x^15 + x^2 + 1

      for (const byte of dataBytes) {
        crc ^= byte
        for (let i = 0; i < 8; i++) {
          if (crc & 0x0001) {
            crc = ((crc >> 1) ^ polynomial) & 0xffff
          } else {
            crc >>= 1
          }
        }
      }
      return crc.toString(16).toUpperCase().padStart(4, '0').match(/\w{2}/g).reverse()
    }
    function arrayToBuffer(arr) {
      let cmd = arr.map((v) => '0x' + v)
      let uint16arr = new Uint8Array(cmd)
      return uint16arr.buffer //返回由 Uint8Array引用的 ArrayBuffer
    }
    // 生成校验码
    let verifyEnd = crc16modbus(params.value)
    params.value.push(...verifyEnd)
    // 转为buffer
    params.value = arrayToBuffer(params.value)
  },
})
